﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using CamadaDeNegocios;
using CamadaDeNegocios.Lib;
using CamadaDeNegocios.Models;
using CamadaDeNegocios.Controllers;

namespace FinanFlex
{
    public partial class Pessoa : Form
    {
        public CamadaDeNegocios.Models.Pessoa PessoaSelecionada { get; set; }

        private PessoaJuridica _pessoaJuridica;
        private PessoaFisica _pessoaFisica;

        private List<PessoaEndereco> Enderecos;

        public Pessoa()
        {
            InitializeComponent();
            this.PreencherCombo();
        }

        /// <summary>
        /// Método para preencher os dados das combos
        /// </summary>
        private void PreencherCombo()
        {
            this.cmbPessoa.Items.Add(TipoPessoa.Fisica);
            this.cmbPessoa.Items.Add(TipoPessoa.Juridica);

            this.cmbSituacao.Items.Add(SituacaoCadastro.Ativo);
            this.cmbSituacao.Items.Add(SituacaoCadastro.Inativo);

            this.cmbEndereco.Items.Add("Endereço 1");
            
            this.cmbEndereco.SelectedItem = "Endereço 1";
            this.cmbPessoa.SelectedItem = TipoPessoa.Fisica;
            this.cmbSituacao.SelectedItem = SituacaoCadastro.Ativo;
        }

        /// <summary>
        /// Método executado para verificar se há registro de pessoas que deve ser atualizado
        /// </summary>
        private void Editar()
        {
            if (PessoaSelecionada != null)
            {
                if (PessoaSelecionada.GetType() == typeof(PessoaJuridica))
                {
                    // carrega uma instância de PessoaJuridica
                    _pessoaJuridica = (PessoaJuridica)PessoaSelecionada;

                    // passa os dados para os campos
                    this.cmbPessoa.SelectedItem = TipoPessoa.Juridica;
                    this.txtNome.Text = _pessoaJuridica.RazaoSocial;
                    this.txtSobrenome.Text = _pessoaJuridica.NomeFantasia;
                    this.txtCPF.Text = _pessoaJuridica.CNPJ;
                    this.txtRG.Text = _pessoaJuridica.Inscricao;
                    this.txtHomePage.Text = _pessoaJuridica.HomePage;
                    this.txtEmail.Text = _pessoaJuridica.Email;
                    this.txtTelefoneFixo.Text = _pessoaJuridica.Telefone;
                    this.txtTelefoneMovel.Text = _pessoaJuridica.Celular;

                    this.CarregarEnderecos(_pessoaJuridica.IdPessoa);

                }
                else
                {
                    _pessoaFisica = (PessoaFisica)PessoaSelecionada;

                    this.cmbPessoa.SelectedItem = TipoPessoa.Fisica;
                    this.txtNome.Text = _pessoaFisica.Nome;
                    this.txtSobrenome.Text = _pessoaFisica.Sobrenome; ;
                    this.txtCPF.Text = _pessoaFisica.CPF;
                    this.txtRG.Text = _pessoaFisica.RG;
                    this.txtHomePage.Text = _pessoaFisica.HomePage;
                    this.txtEmail.Text = _pessoaFisica.Email;
                    this.txtTelefoneFixo.Text = _pessoaFisica.Telefone;
                    this.txtTelefoneMovel.Text = _pessoaFisica.Celular;

                    this.CarregarEnderecos(_pessoaFisica.IdPessoa);

                }
            }
            else
            {
                _pessoaFisica = new PessoaFisica();
            }
        }

        /// <summary>
        /// Método para preencher a lista de endereços da pessoa
        /// </summary>
        /// <param name="pIdPessoa">Código da Pessoa</param>
        private void CarregarEnderecos(int pIdPessoa)
        {
            // pesquisa os endereços da pessoa
            this.Enderecos = PessoaEnderecoController.PorPessoa(pIdPessoa);

            // verifica se foram encontrados registros
            if (this.Enderecos.Count > 0)
            {
                // carrega o primeiro endereço nos campos
                this.txtLogradouro.Text = this.Enderecos[0].Logradouro;
                this.txtNumero.Text = this.Enderecos[0].Numero.ToString();
                this.txtBairro.Text = this.Enderecos[0].Bairro;
                this.txtCidade.Text = this.Enderecos[0].Cidade;
                this.txtEstado.Text = this.Enderecos[0].Estado;

                if (this.Enderecos.Count > 1)
                {
                    // limpa os itens da combo de endereços
                    this.cmbEndereco.Items.Clear();

                    // acrescenta os itens na combo de endereços
                    for (int i = 1; i < this.Enderecos.Count; i++)
                    {
                        // acrescenta o item
                        this.cmbEndereco.Items.Add("Endereco " + i.ToString());
                    }
                }
            }
        }

        /// <summary>
        /// Método para salvar as informações da pessoa
        /// </summary>
        private void Salvar()
        {
            if (_pessoaFisica != null)
            {
                try
                {
                    _pessoaFisica.Nome = this.txtNome.Text;
                    _pessoaFisica.Sobrenome = this.txtSobrenome.Text;
                    _pessoaFisica.CPF = this.txtCPF.Text;
                    _pessoaFisica.RG = this.txtRG.Text;
                    _pessoaFisica.Telefone = this.txtTelefoneFixo.Text;
                    _pessoaFisica.Celular = this.txtTelefoneMovel.Text;
                    _pessoaFisica.HomePage = this.txtHomePage.Text;
                    _pessoaFisica.Email = this.txtEmail.Text;
                    _pessoaFisica.Situacao = (SituacaoCadastro) this.cmbSituacao.SelectedItem;

                    if (_pessoaFisica.IdPessoa > 0)
                        PessoaFisicaController.Alterar(_pessoaFisica);
                    else
                        PessoaFisicaController.Inserir(_pessoaFisica);

                    this.DialogResult = System.Windows.Forms.DialogResult.OK;

                    MessageBox.Show("Registro salvo com sucesso!", "Salvar Registro", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    this.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Não foi possível realizar a operação!\n\nErro: " + ex.Message, "Salvar Registro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }
            else
                if (_pessoaJuridica != null)
                {
                    try
                    {
                        _pessoaJuridica.RazaoSocial = this.txtNome.Text;
                        _pessoaJuridica.NomeFantasia = this.txtSobrenome.Text;
                        _pessoaJuridica.CNPJ = this.txtCPF.Text;
                        _pessoaJuridica.Inscricao = this.txtRG.Text;
                        _pessoaJuridica.Telefone = this.txtTelefoneFixo.Text;
                        _pessoaJuridica.Celular = this.txtTelefoneMovel.Text;
                        _pessoaJuridica.HomePage = this.txtHomePage.Text;
                        _pessoaJuridica.Email = this.txtEmail.Text;
                        _pessoaJuridica.Situacao = (SituacaoCadastro)this.cmbSituacao.SelectedItem;

                        if (_pessoaJuridica.IdPessoa > 0)
                            PessoaJuridicaController.Alterar(_pessoaJuridica);
                        else
                            PessoaJuridicaController.Inserir(_pessoaJuridica);

                        this.DialogResult = System.Windows.Forms.DialogResult.OK;

                        MessageBox.Show("Registro salvo com sucesso!", "Salvar Registro", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Não foi possível realizar a operação!\n\nErro: " + ex.Message, "Salvar Registro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnConfirmar_Click(object sender, EventArgs e)
        {
            this.Salvar();
        }

        private void cmbPessoa_SelectedIndexChanged(object sender, EventArgs e)
        {

            // verifica o tipo de pessoa selecionado
            switch ((TipoPessoa)this.cmbPessoa.SelectedItem)
            {
                case TipoPessoa.Fisica:
                    // verifica se foi passado alguma pessoa para edição
                    if (PessoaSelecionada != null)
                    {
                        // verifica se a pessoa informada é Juridica para fazer o CAST para Fisica ou converte direto para Fisica
                        if (PessoaSelecionada.GetType() == typeof(PessoaJuridica))
                            _pessoaFisica = (PessoaFisica)(PessoaJuridica)PessoaSelecionada;
                        else
                            _pessoaFisica = (PessoaFisica)PessoaSelecionada;
                    }
                    else
                    {
                        // se não houver pessoa selecionada gera uma nova instância da classe PessoaFisica
                        _pessoaFisica = new PessoaFisica();
                    }
                    // limpa a variavel da pessoa Juridica
                    _pessoaJuridica = null;

                    // altera os labels
                    lblNome.Text = "Nome";
                    lblSobrenome.Text = "Sobrenome";
                    lblCPF.Text = "CPF";
                    lblRG.Text = "RG";
                    break;

                case TipoPessoa.Juridica:
                    // verifica se foi passado alguma pessoa para edição
                    if (PessoaSelecionada != null)
                    {
                        // verifica se a pessoa informada é Fisica para fazer o CAST para Juridica ou converte direto para Juridica
                        if (PessoaSelecionada.GetType() == typeof(PessoaFisica))
                            _pessoaJuridica = (PessoaJuridica)(PessoaFisica)PessoaSelecionada;
                        else
                            _pessoaJuridica = (PessoaJuridica)PessoaSelecionada;
                    }
                    else
                    {
                        // se não houver pessoa selecionada gera uma nova instância da classe PessoaJuridica
                        _pessoaJuridica = new PessoaJuridica();
                    }
                    // limpa a variavel da pessoa Juridica
                    _pessoaFisica = null;

                    // altera os labels
                    lblNome.Text = "Razão Social";
                    lblSobrenome.Text = "Nome Fantasia";
                    lblCPF.Text = "CNPJ";
                    lblRG.Text = "Inscrição Estadual";
                    break;
            }
        }

        private void Pessoa_Load(object sender, EventArgs e)
        {
            this.Editar();
        }
    }
}
